home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
util
/
crypt
/
crypt_device_1_8.lha
/
idea68k.a
< prev
next >
Wrap
Text File
|
1992-11-30
|
7KB
|
379 lines
;-------------------------------------------------------------------------
; idea68k.a
;
; New version of assembler idea cipher
;
; Author: Risto Paasivirta <paasivir@jyu.fi>
;
;-------------------------------------------------------------------------
;
section text,code
;-------------------------------------------------------------------------
; Functions defined in this module
;-------------------------------------------------------------------------
; Internal functions
xdef __mul_idea ; mul mod 65537
xdef __inv_idea ; inv mod 65537
xdef __en_key_idea ; userkey to encrypt subk.
xdef __de_key_idea ; invert subkey
xdef __cipher_idea ; cipher core
;-------------------------------------------------------------------------
; Key handling
xdef _idea_key_schedule ; full key schedule
;-------------------------------------------------------------------------
; En/Decryption
xdef _idea_ebc_encrypt ; electronic code book
xdef _idea_cbc_encrypt ; cipher block chaining
;-------------------------------------------------------------------------
; Constants
;-------------------------------------------------------------------------
; subkey size
ZSIZE equ 108
;-------------------------------------------------------------------------
; Internal functions
;-------------------------------------------------------------------------
; macro: imul dea,dn , d7=scratch
; Arg 1 accessed only once (can be (an)+) Handles zero value arguments.
;
imul macro
move.w \2,d7
beq.b imul0\@
mulu.w \1,d7
beq.b imul1\@
move.w d7,\2
swap d7
sub.w d7,\2
moveq #0,d7
addx.w d7,\2
bra.b imul3\@
imul0\@ move.w \1,\2
imul1\@ neg.w \2
addq.w #1,\2
imul3\@
endm
;-------------------------------------------------------------------------
; word16 _mul_idea(word16 a,word16 b)
;
; Return a * b mod 65537
__mul_idea move.l d7,-(sp)
move.w 10(sp),d0
imul 14(sp),d0
move.l (sp)+,d7
rts
;-------------------------------------------------------------------------
; word16 _inv_idea(word16 a)
; d0 = inv(d0)
;
; Return multiplicative inverse of a mod 65537
;
__inv_idea move.w 6(sp),d0
inv cmp.w #2,d0 ; inv(0)=0,inv(1)=1
bcs.b 1$
cmp.w #3,d0
bcc.b 2$
move.w #32769,d0 ; inv(2)
1$ rts
2$ movem.l d2-d5,-(sp)
move.l #$10001,d1 ; d1 = n1
moveq #1,d2 ; d2 = b2
moveq #0,d3 ; d3 = b1
inv_loop divu.w d0,d1
move.l d1,d4
swap d4 ; r = d4
tst.w d4
beq.b inv_done
move.w d2,d5
muls.w d1,d5
exg d3,d2
sub.l d5,d2
moveq #0,d1
move.w d0,d1
move.w d4,d0
bra.b inv_loop
inv_done tst.l d2
bpl.b 1$
move.l #$10001,d0
add.l d2,d0
bra.b 2$
1$ move.l d2,d0
2$ movem.l (sp)+,d2-d5
rts
;-------------------------------------------------------------------------
; _en_key_idea(a0=userkey,a1=subkey)
;
; Create 54-word encryption subkey from 8-word user key
;
__en_key_idea movem.l 4(sp),a0-a1
en_key_idea movem.l d2-d4,-(sp)
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)
suba.w #12,a1
moveq #47,d0
moveq #0,d1
moveq #14,d4
1$ move.w d1,d2
addq.w #2,d2
and.w d4,d2
move.w 0(a1,d2.w),d3
swap d3
addq.w #2,d2
and.w d4,d2
move.w 0(a1,d2.w),d3
lsr.l #7,d3
move.w d3,16(a1,d1.w)
addq.w #2,d1
move.w d1,d2
and.w #16,d2
adda.w d2,a1
and.w d4,d1
dbra d0,1$
movem.l (sp)+,d2-d4
rts
;-------------------------------------------------------------------------
; _de_key_idea(a0=subkey,a1=inverted_subkey)
;
; Invert 54-word subkey for idea decrypting
;
__de_key_idea movem.l 4(sp),a0-a1
de_key_idea movem.l d2-d3,-(sp)
moveq #96,d2
moveq #0,d3
bra.b 2$
1$ move.l 8(a0,d2.w),-4(a1,d3.w)
2$ move.w 0(a0,d2.w),d0
bsr inv
move.w d0,0(a1,d3.w)
move.l 2(a0,d2.w),d0
neg.w d0
swap d0
neg.w d0
move.l d0,2(a1,d3.w)
move.w 6(a0,d2.w),d0
bsr inv
move.w d0,6(a1,d3.w)
add.w #12,d3
sub.w #12,d2
bcc.b 1$
move.l 2(a1),d0
swap d0
move.l d0,2(a1)
move.l 98(a1),d0
swap d0
move.l d0,98(a1)
movem.l (sp)+,d2-d3
rts
;-------------------------------------------------------------------------
; _cipher_idea(a0=src,a1=dest,a2=subkey)
;
; En/Decipher 4-word block from src to dest using 54-word subkey as key
;
round macro
imul (a0)+,d0
add.w (a0)+,d1
add.w (a0)+,d2
imul (a0)+,d3
move.w d0,d4
eor.w d2,d4
imul (a0)+,d4
move.w d1,d5
eor.w d3,d5
add.w d4,d5
imul (a0)+,d5
move.w d5,d6
add.w d4,d6
eor.w d5,d0
move.w d1,d4
move.w d2,d1
eor.w d5,d1
move.w d4,d2
eor.w d6,d2
eor.w d6,d3
endm
__cipher_idea move.l a2,-(sp)
movem.l 8(sp),a0-a2
bsr.b cipher_idea
move.l (sp)+,a2
rts
cipher_idea movem.l d2-d7,-(sp)
movem.w (a0),d0-d3
movea.l a2,a0
ifnd UNROLL
moveq #7,d6
cipher_loop swap d6
round
swap d6
dbra d6,cipher_loop
endc
ifd UNROLL
round
round
round
round
round
round
round
round
endc
imul (a0)+,d0
exg d1,d2
add.w (a0)+,d1
add.w (a0)+,d2
imul (a0)+,d3
movem.w d0-d3,(a1)
movem.l (sp)+,d2-d7
rts
;-------------------------------------------------------------------------
; User callable routines
;-------------------------------------------------------------------------
; idea_key_schedule(word16 *uk, word16 *ks)
;
; Create en/decryption keys from 8-word user key uk to 108-word key
; schedule ks.
;
_idea_key_schedule
movem.l 4(sp),a0-a1
bsr en_key_idea
movea.l 8(sp),a0
movea.l a0,a1
adda.w #ZSIZE,a1
bra de_key_idea
;-------------------------------------------------------------------------
; idea_ebc_encrypt(word16 *src,word16 *dst,word16 *ks,int mode)
;
; En/decrypt 4 word (8-byte) block from src to dst using electronic code
; book mode.
;
_idea_ebc_encrypt
move.l a2,-(sp)
movem.l 8(sp),a0-a2/d0
tst.l d0
bne.l 1$
adda.w #ZSIZE,a2
bsr cipher_idea
movea.l (sp)+,a2
rts
;-------------------------------------------------------------------------
; idea_cbc_encrypt(word16 *src, word16 *dst, int len, word16 *ks,
; word16 *ivec,int mode)
;
; Encrypt (mode != 0) or decrypt (mode == 0) src to dst in cipher block
; chaining mode. Len must be multiple of 8 bytes. Ivec contains final
; vector at return.
;
_idea_cbc_encrypt
movem.l a2-a5/d2-d4,-(sp)
lea 32(sp),a0
move.l (a0)+,a3 ; src
move.l (a0)+,a4 ; dst
move.l (a0)+,d2 ; len
move.l (a0)+,a2 ; ks
move.l (a0)+,a5 ; ivec
tst.l (a0) ; mode?
beq cbc_decrypt
cbc_en_loop move.l (a3)+,d3 ; get data to encrypt
move.l (a3)+,d4
eor.l d3,(a5) ; eor with ivec
eor.l d4,4(a5)
movea.l a5,a0 ; cipher ivec to dst
movea.l a4,a1
bsr cipher_idea
move.l (a4)+,(a5) ; copy cipher to ivec
move.l (a4)+,4(a5)
subq #8,d2
bhi.b cbc_en_loop
cbc_exit movem.l (sp)+,a2-a5/d2-d4
rts
cbc_decrypt adda.w #ZSIZE,a2 ; decrypt key
cbc_de_loop move.l (a3)+,d3 ; store cipher data (next ivec)
move.l (a3)+,d4
lea -8(a3),a0 ; decrypt to src
movea.l a4,a1
bsr cipher_idea
move.l (a5)+,d0 ; swap next/curr ivec
move.l (a5),d1
move.l d4,(a5)
move.l d3,-(a5)
eor.l d0,(a4)+ ; eor deciphered with ivec
eor.l d1,(a4)+
subq #8,d2
bhi.b cbc_de_loop
bra.b cbc_exit
;-------------------------------------------------------------------------
end
;-------------------------------------------------------------------------